//
// Created by LiuYou on 2021/5/8.
//


#include <cstdio>
#include <cstdlib>
#include <cstring>

int
main(int argc, char** argv) {
    if (argc < 2) {
        std::fprintf(stderr, "Usage: ...");
        std::exit(1);
    }

    FILE* fp = std::fopen(argv[1], "r");
    if (fp == nullptr) {
        std::perror("fopen()");
        std::exit(1);
    }

    // TODO 注意: lineBuf和linSize这两个变量的初始化非常的必须！！！！
    //  一定一定一定一定一定一定一定一定要进行初始化这两个变量。
    char* lineBuf{};
    size_t lineSize{};

    for (;;) {
        // TODO 注意: lineBuf这个字符指针在getline函数内被赋值为malloc函数分配的内存空间(即malloc的返回值由lineBuf接受,
        //  lineBuf指向了动态分配的这块内存。而lineSize这个变量则存储动态分配的这块空间的字节数(大小)。因为C没有引用类型, 所以
        //  这个参数被设计成了指针类型。)。如果读取的文件的某一行字符数大于了120个字节数, 那么就会在getline函数内部调用realloc再
        //  扩大动态内存使getline能够读取到一行大于120个字节。
        __ssize_t readSize = getline(&lineBuf, &lineSize, fp);
        if (readSize < 0) {
            break;
        }
        // 输出每一行的大小
        std::printf("------------------\n");
        std::fprintf(stdout, "%zu\n", std::strlen(lineBuf));
        std::fprintf(stdout, "%s\n", lineBuf);
        // TODO 注意:
        //  经过测试, 在getline函数内容malloc的一块空间的大小就是 120 个字节。
        std::fprintf(stdout, "%zu\n", lineSize);
        std::printf("------------------\n");
    }


    std::fclose(fp);
    return 0;
}